cp 命令
通过编写cp
命令来了解Unix读写文件
准备知识
创建文件
创建活重写文件的一种方法是使用系统调用函数 creat
(注意没有e)
creat | |
---|---|
Target | Create/rewirte a file |
Header | #include <fcntl.h> |
Origin | int fd = create(char *filename, mode_t mode) |
Args | filename file name, mode access mode |
Return | -1 error, fd success |
creat
告诉内核创建一个名为filename的文件, 如果这个文件不存在, 就创建它, 如果已存在, 就把它的你日工清空, 把文件长度设为0
如果内核成功地创建了文件, 那么文件的权限位被设置为由第二个参数mode所指定的值
fd = creat("addressbook", 0644);
创建一个名为 addressbook
的文件, 如果文件不存在, 那么文件的权限位被设为rw-r--r--
.如果文件已经存在, 内容被清空. fd
将指向 addressbook
的文件描述符
写文件
用write
系统调用向已打开的文件中写入数据
write | |
---|---|
Target | Write the data to file from memory |
Header | #include <unistd.h> |
Origin | ssize_t result = write(int fd, void *buf, size_t amt) |
Args | fd file description, buf data in member, amt bytes of data |
Return | -1 error, num written success |
cp1.c
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #define BUFFERSIZE 4096 #define COPYMODE 0644 void oops(char *, char *); int main (int argc, char *argv[]) { int in_fd, out_fd, n_chars; char buf[BUFFERSIZE]; if (argc != 3) { fprintf(stderr, "usage: %s source destination\n", *argv); exit(1); } if ((in_fd = open(argv[1], O_RDONLY)) == -1) oops("Cannot open", argv[1]); if ((out_fd = creat(argv[2], COPYMODE)) == -1) oops("Cannot creat", argv[2]); while ((n_chars = read(in_fd, buf, BUFFERSIZE))> 0) if (write(out_fd, buf, n_chars) != n_chars) oops("Write error to", argv[2]); if (close(in_fd) == -1 || close(out_fd) == -1) oops("Error closing files", ""); } void oops(char *s1, char *s2) { fprintf(stderr, "Error: %s ", s1); perror(s2); exit(1); }